//package name.huliqing.qfaces.temp;
//
//import java.io.IOException;
//import java.util.List;
//import java.util.logging.Logger;
//import javax.faces.component.UIComponent;
//import javax.faces.component.UIComponentBase;
//import javax.faces.component.UIForm;
//import javax.faces.context.FacesContext;
//import javax.faces.context.ResponseWriter;
//
//import name.huliqing.qfaces.QFaces;
//
//public class ____20100620_Frame extends UIComponentBase {
//	private final static Logger logger = Logger.getLogger(____20100620_Frame.class.getName());
//
//	// "header"的描述文字
//	private String labelHeader = "QFaces Frame";
//	
//	// 设置组件在客户端的初始可见状态,注：是初始状态
//	private Boolean visible = false;
//	
////	// 是否渲染组件(与visible不同)
////	private Boolean rendered;
//	
//	// 设定组件是否为可拖动的
//	private Boolean dragEnabled = true;
//	
//	// 是否渲染组件的边框
//	private Boolean renderBorder = true;
//	
//	// 是否显示Close按钮
//	private Boolean renderCloseButton = true;
//	
//	// “关闭”按钮的图标地址
//	private String srcCloseButton = null;
//	
//	// 是否自动将Frame居中
//	private Boolean center = true;
//	
//	// 是否使用遮罩层
//	private Boolean displayShade = false;
//	
//	// 遮罩层的颜色
//	private String shadeColor = "black";
//	
//	// 遮罩层的不透明度
//	private float shadeOpaque = 0.3f;
//	
//	// 组件的皮肤样式
//	private String face = "1";
//	
//	// Header的样式
//	private String styleClassHeader = "qfaces_frame_header";
//	
//	// ---- 内部参数
//	
//	// 组件的客户端唯一ID
//	private String ID_CLIENT;
//	
//	// Header区域，包含labelHeader信息
//	private String ID_HEADER_ZONE;
//	
//	// Close区域，包含close按钮
//	private String ID_CLOSE_ZONE;
//	
//	// hidden input组件的id,该input在客户端保存当前组件的visible状态,1可见，0不可见.
//	// 保存这个状态，以保证客户端在改变frame的可视状态并且在回传之后，组件仍能够知道
//	// 之前的可视状态，而不是每次都重置visible的状态
//	private String ID_FOR_VISIBLE_STATE;
//	
////	// 在某些瀏覽器下可能會在邊框的間隔部分出現空白，以下style解決這個問題
////	private String styleFixBug = "margin:0;padding:0;font-size:0;border:0;";
//	
//	
//	@Override
//	public void restoreState(FacesContext fc, Object state) {
//		Object[] objs = (Object[]) state;
//		super.restoreState(fc, objs[0]);
//		this.ID_FOR_VISIBLE_STATE = (String) objs[1];
//	}
//
//	@Override
//	public Object saveState(FacesContext fc) {
//		Object[] objs = new Object[2];
//		objs[0] = super.saveState(fc);
//		objs[1] = this.ID_FOR_VISIBLE_STATE;
//		return objs;
//	}
//
//	@Override
//	public String getFamily() {
//		return null;
//	}
//	
//	private void init(FacesContext fc) throws IOException {
//		// 获取默认参数
//		if (this.srcCloseButton == null)
//			this.srcCloseButton = QFaces.getResLoader2().makeImageSrc("name/huliqing/qfaces/images/frame-close.jpg");
//		labelHeader = (String) QFaces.getAttribute(this, "labelHeader", this.labelHeader);
//		visible = QFaces.convertToBoolean(QFaces.getAttribute(this, "visible", this.visible));
//		dragEnabled = QFaces.convertToBoolean(QFaces.getAttribute(this, "dragEnabled", this.dragEnabled));
//		renderBorder = QFaces.convertToBoolean(QFaces.getAttribute(this, "renderBorder", this.renderBorder));
//		renderCloseButton = QFaces.convertToBoolean(QFaces.getAttribute(this, "renderCloseButton", this.renderCloseButton));
//		srcCloseButton = (String) QFaces.getAttribute(this, "srcCloseButton", this.srcCloseButton);
//		face = (String) QFaces.getAttribute(this, "face", this.face);
////		styleClassHeader = (String) QFaces.getAttribute(this, "styleClassHeader", this.styleClassHeader);
//		center = QFaces.convertToBoolean(QFaces.getAttribute(this, "center", this.center));
//		displayShade = QFaces.convertToBoolean(QFaces.getAttribute(this, "displayShade", this.displayShade));
//		shadeColor = (String) QFaces.getAttribute(this, "shadeColor", this.shadeColor);
//		shadeOpaque = QFaces.convertToFloat(QFaces.getAttribute(this, "shadeOpaque", this.shadeOpaque));
//		if (shadeOpaque > 1.0f)
//			shadeOpaque = 1.0f;
//		if (shadeOpaque < .0f)
//			shadeOpaque = .0f;
//		
//		// 设置ID
//		ID_CLIENT = getClientId(fc);
//	}
//
//	@Override
//	public void encodeBegin(FacesContext fc) throws IOException {
//		init(fc);
//		
//		this.ID_HEADER_ZONE = ID_CLIENT + ":header";
//		this.ID_CLOSE_ZONE = ID_CLIENT + ":close";
//		this.ID_FOR_VISIBLE_STATE = ID_CLIENT + ":visible";
//		ResponseWriter rw = fc.getResponseWriter();
//		if (this.renderBorder) {
//			encodeBeginWidthBorder(rw);
//		} else {
//			encodeBeginNoBorder(rw);			
//		}
//		
//		// visibleState用于保存组件在客户端的可见状态，在回传时会取到该值,参见 decode
//		ClientState visibleState = new ClientState();
//		visibleState.set(this.ID_FOR_VISIBLE_STATE, (this.visible ? "1" : "0"));
//		
//		// visibleState每次都需要重建，所以不需要保存状态。
//		visibleState.setTransient(true);
//		
//		// 查找子组件中的form,如果当前组件的子组件中存在UIForm,则必须将visibleState放到这个Form中，
//		// 否则在Form提交时，组件将找不到visibleState,这会导致无法识别当前组件在客户端中的可视状态。
//		// 如果找不到子组件中的Form(Form可能不存在或者作为当前组件的父组件存在),
//		// 则直接将visibleState加到当前组件的子组件列表中
//		UIForm form = this.findChildForm(this);
//		if (form != null) {
//			form.getChildren().add(visibleState);
//		} else {
//			this.getChildren().add(visibleState);
//		}
//	}
//	 
//	/**
//	 * 从给定的组件中查找子组件中的UIForm(包含当前组件)
//	 * @param ui
//	 * @return
//	 */
//	private UIForm findChildForm(UIComponent ui) {
//		logger.fine("查找子Form.................:");
//		if (ui == null)
//			return null;
//		UIForm target = null;
//		if (ui instanceof UIForm) {
//			target = (UIForm) ui;
//		} else {
//			List<UIComponent> children = ui.getChildren();
//			if (children != null && !children.isEmpty()) {
//				for (UIComponent child : children) {
//					target = findChildForm(child);
//					if (target != null)
//						break;
//				}
//			}
//		}
//		return target;
//	}
//
//	@Override
//	public void encodeEnd(FacesContext fc) throws IOException {
//		if (this.renderBorder) {
//			encodeEndWidthBorder(fc.getResponseWriter());
//		} else {
//			encodeEndNoBorder(fc.getResponseWriter());			
//		}
//		StringBuilder jsInit = new StringBuilder("QFaces.Faces.UIFrame.init(")
//		.append(" \"" + this.ID_CLIENT + "\"")
//		.append(",\"" + this.ID_HEADER_ZONE + "\"")
//		.append(",\"" + this.ID_CLOSE_ZONE + "\"")
//		.append(",\"" + this.ID_FOR_VISIBLE_STATE + "\"")
//		.append(",\"" + this.renderBorder.toString() + "\"")
//		.append(",\"" + this.dragEnabled.toString() + "\"")
//		.append(",\"" + this.renderCloseButton.toString() + "\"")
//		.append(",\"" + this.srcCloseButton + "\"")
//		.append(",\"" + this.center.toString() + "\"")
//		.append(",\"" + this.displayShade.toString() + "\"")
//		.append(",\"" + this.shadeColor + "\"")
//		.append(",\"" + this.shadeOpaque + "\"")
//		.append(")");
//		QFaces.getResLoader2().addJavaScript("name/huliqing/qfaces/resource/Frame.js");
//		QFaces.getResLoader2().addJSInit(jsInit.toString());
//	}
//	
//	private void encodeBeginWidthBorder(ResponseWriter rw) throws IOException {
//
//		
////		String FRAME_00 = "name/huliqing/qfaces/images/frame-" + face + "-00.png";
////	    String FRAME_01 = "name/huliqing/qfaces/images/frame-" + face + "-01.png";
////	    String FRAME_02 = "name/huliqing/qfaces/images/frame-" + face + "-02.png";
////	    String FRAME_10 = "name/huliqing/qfaces/images/frame-" + face + "-10.png";
////	    String FRAME_11 = "name/huliqing/qfaces/images/frame-" + face + "-11.png";
////	    
////		rw.startElement("table", this);
////		rw.writeAttribute("id", this.ID_CLIENT, null);
////		rw.writeAttribute("style", "display:none;", null);
////		rw.writeAttribute("border", "0", null);
////		rw.writeAttribute("cellspacing", "0", null);
////		rw.writeAttribute("cellpadding", "0", null);
////		rw.startElement("tr", this);
////			rw.startElement("td", this);
////			rw.writeAttribute("style", this.styleFixBug, null);
////			QFaces.getResLoader2().loadImage(FRAME_00);
////			rw.endElement("td");
////			
////			rw.startElement("td", this);
////			rw.writeAttribute("style", "background:url(" + QFaces.getResLoader2().makeImageSrc(FRAME_01) + ") repeat-x", null);
////				rw.startElement("table", this);
////				rw.writeAttribute("class", this.styleClassHeader, null);
////				rw.writeAttribute("border", "0", null);
////				rw.writeAttribute("cellspacing", "0", null);
////				rw.writeAttribute("cellpadding", "0", null);
////				rw.writeAttribute("width", "100%", null);
////				rw.startElement("tr", this);
////				rw.startElement("td", this);
////				rw.writeAttribute("id", this.ID_HEADER_ZONE, null);
////				rw.writeText(this.labelHeader, null);
////				rw.endElement("td");
////				rw.startElement("td", this);
////				rw.writeAttribute("id", this.ID_CLOSE_ZONE, null);
////				rw.writeAttribute("width", "1", null);
////				rw.endElement("td");
////				rw.endElement("tr");
////				rw.endElement("table");
////			rw.endElement("td");
////			
////			rw.startElement("td", this);
////			rw.writeAttribute("style", this.styleFixBug, null);
////			QFaces.getResLoader2().loadImage(FRAME_02);
////			rw.endElement("td");
////		rw.endElement("tr");
////		
////		rw.startElement("tr", this);
////			rw.startElement("td", this);
////			rw.writeAttribute("style", this.styleFixBug + "background:url(" + QFaces.getResLoader2().makeImageSrc(FRAME_10) + ") repeat-y", null);
////			rw.endElement("td");
////			
////			rw.startElement("td", this);
////			rw.writeAttribute("style", "background-image:url(" + QFaces.getResLoader2().makeImageSrc(FRAME_11) + ")", null);
//	}
//
//	private void encodeEndWidthBorder(ResponseWriter rw) throws IOException {
//
//		
////		String FRAME_12 = "name/huliqing/qfaces/images/frame-" + face + "-12.png";
////	    String FRAME_20 = "name/huliqing/qfaces/images/frame-" + face + "-20.png";
////	    String FRAME_21 = "name/huliqing/qfaces/images/frame-" + face + "-21.png";
////	    String FRAME_22 = "name/huliqing/qfaces/images/frame-" + face + "-22.png";
////	    
////			rw.endElement("td");
////			rw.startElement("td", this);
////			rw.writeAttribute("style", this.styleFixBug + "background:url(" + QFaces.getResLoader2().makeImageSrc(FRAME_12) + ") repeat-y", null);
////			rw.endElement("td");
////		rw.endElement("tr");
////		rw.startElement("tr", this);
////			rw.startElement("td", this);
////			rw.writeAttribute("style", this.styleFixBug, null);
////			QFaces.getResLoader2().loadImage(FRAME_20);
////			rw.endElement("td");
////			
////			rw.startElement("td", this);
////			rw.writeAttribute("style", this.styleFixBug + "background:url(" + QFaces.getResLoader2().makeImageSrc(FRAME_21) + ") repeat-x", null);
////			rw.endElement("td");
////			
////			rw.startElement("td", this);
////			rw.writeAttribute("style", this.styleFixBug, null);
////			QFaces.getResLoader2().loadImage(FRAME_22);
////			rw.endElement("td");
////		rw.endElement("tr");
////		rw.endElement("table");
//	}
//	
//	private void encodeBeginNoBorder(ResponseWriter rw) throws IOException {
//		rw.startElement("table", this);
//		rw.writeAttribute("id", this.ID_CLIENT, null);
//		rw.writeAttribute("style", "display:none;", null);
//		rw.writeAttribute("border", "0", null);
//		rw.writeAttribute("cellspacing", "0", null);
//		rw.writeAttribute("cellpadding", "0", null);
//		rw.startElement("tr", this);
//		rw.startElement("td", this);
//	}
//	
//	private void encodeEndNoBorder(ResponseWriter rw) throws IOException {
//		rw.endElement("td");
//		rw.endElement("tr");
//		rw.endElement("table");
//	}
//	
//	// -----------------------------------------------------------------
//	
//	@Override
//	public void decode(FacesContext fc) {
//		super.decode(fc);
//		// ID_FOR_VISIBLE_STATE 必须有保存状态，这里才可用
//		String visibleState = QFaces.getParam(this.ID_FOR_VISIBLE_STATE);
//		// 让组件知道来自客户端的当前可见状态，这样在重新渲染时可同步这个状态
//		this.visible = "1".equalsIgnoreCase(visibleState);
//	}
//
//	public String getLabelHeader() {
//		return labelHeader;
//	}
//
//	public void setLabelHeader(String labelHeader) {
//		this.labelHeader = labelHeader;
//	}
//
//	public Boolean getVisible() {
//		return visible;
//	}
//
//	public void setVisible(Boolean visible) {
//		this.visible = visible;
//	}
//
//	public Boolean getDragEnabled() {
//		return dragEnabled;
//	}
//
//	public void setDragEnabled(Boolean dragEnabled) {
//		this.dragEnabled = dragEnabled;
//	}
//
//	public Boolean getRenderBorder() {
//		return renderBorder;
//	}
//
//	public void setRenderBorder(Boolean renderBorder) {
//		this.renderBorder = renderBorder;
//	}
//
//	public Boolean getRenderCloseButton() {
//		return renderCloseButton;
//	}
//
//	public void setRenderCloseButton(Boolean renderCloseButton) {
//		this.renderCloseButton = renderCloseButton;
//	}
//
//	public String getFace() {
//		return face;
//	}
//
//	public void setFace(String face) {
//		this.face = face;
//	}
//
//	public String getStyleClassHeader() {
//		return styleClassHeader;
//	}
//
//	public void setStyleClassHeader(String styleClassHeader) {
//		this.styleClassHeader = styleClassHeader;
//	}
//
//	/**
//	 * 获取组件的客户端ID
//	 * @return
//	 */
//	public String getClientId() {
//		return ID_CLIENT;
//	}
//
//	/**
//	 * 给组件手动生成一个客户端唯一ID。注意：必须保证这个ID是
//	 * 唯一的,否则可能在渲染时出错。
//	 * @param clientId
//	 */
//	public void setClientId(String clientId) {
//		ID_CLIENT = clientId;
//	}
//
//	/**
//	 * 渲染一个input hidden组件在客户端，用于保存客户端状态
//	 * @author huliqing
//	 *
//	 */
//	private class ClientState extends UIComponentBase {
//		private String clientId;
//		private String value;
//		public void set(String clientId, String value) {
//			this.clientId = clientId;
//			this.value = value;
//		}
//		
//		@Override
//		public String getFamily() {return null;}
//
//		@Override
//		public void encodeBegin(FacesContext fc) throws IOException {
//			ResponseWriter rw = fc.getResponseWriter();
//			rw.startElement("input", this);
//			rw.writeAttribute("type", "hidden", null);
//			rw.writeAttribute("id", this.clientId, null);
//			rw.writeAttribute("name", this.clientId, null); // 必要的,否则回传时取不到值
//			rw.writeAttribute("value", this.value, null);
//			rw.endElement("input");
//		}
//
//		@Override
//		public void encodeChildren(FacesContext fc) throws IOException {}
//
//		@Override
//		public void encodeEnd(FacesContext fc) throws IOException {}
//		
//	}
//}
